package kiv.gener;

import java.io.BufferedWriter;
import java.io.FileWriter;
import java.io.IOException;
import java.io.PrintWriter;


/**
 * Třída sloužící ke spojení jednotlivých odběrných míst za použití již
 * vytvořeného ArrayListu.
 * 
 * @author Ondřej Ptáček
 * 
 */
public class PropojMista {
	
/**
 * @param poleObjektu 
 * 			Proměna pole o velikosti ArrayListu.	
 */
public static  Krajina[] poleObjektu = new Krajina[Odberatele.poleMistKomplet.size()];
/**
 * @param poleVzdalenosti
 * 			Matice do které se ukladají veškeré vzdalenosti.
 */
public static  int[][] poleVzdalenostiDomu = new int[Odberatele.poleMistKomplet.size() - 11][Odberatele.poleMistKomplet.size() - 11];
/**
* Metoda Vzdalenosti() spočte všechny vzálenosti od jednotlivých odběrných míst
* a uloží do příslušného pole.
*/
public static void spoctiVzdalenosti(){
	 int id = 11;
     int dum = 11;
     do {
         int vstupnix = Odberatele.poleMistKomplet.get(id).x;
         int vstupniy = Odberatele.poleMistKomplet.get(id).y;
         do // pocitani vzdalenosti od ostatnich odbernych mist
         {
             int xdomu = Odberatele.poleMistKomplet.get(dum).x;
             int ydomu = Odberatele.poleMistKomplet.get(dum).y;
             double prvni = Math.pow((vstupnix - xdomu), 2);
             double druhy = Math.pow((vstupniy - ydomu), 2);
             prvni = Math.sqrt((prvni + druhy));
             int vzdalenost = (int) prvni;
             poleVzdalenostiDomu[dum - 11][id - 11] = vzdalenost;
             // System.out.println(poleVzdalenostiDomu[dum][id]);
             dum++;
         } while (dum != 1111);
         dum = 11;
         id++;
     } while (id != 1111);
}
/**
 * Metoda Spojuj() přiřazuje sousedy všem navzájem tak aby se vytvořil
 * neorientovaný graf .
 */
public static void Spojuj(){
	Odberatele.typRazeni=2;
	int dva=11;
	int tri=0;
	int ctyri = 1;
	boolean jeVPoli = false;
	do
		{
			SpojElec.sloupec=tri;
			Help.Serad();
			do		//prirazeni 30 sousedu
				{
					if(poleObjektu[dva].pocetSousedu>29)
						{
							//System.out.println("Ctyri");
							break;
						}
					else
						{
							if(ctyri>=1099)
								{
									break;
								}
							else
								{
									if(poleObjektu[RazeniMist.HeapSortDomu.get(ctyri).id].pocetSousedu>29)
										{
											ctyri++;
										}
									else
										{
											//System.out.println(ctyri);
											//System.out.println(dva);
											//System.out.println(RazeniDomu.HeapSortDomu.get(ctyri).id);
											if(poleObjektu[dva].vzdalenostiDomu[RazeniMist.HeapSortDomu.get(ctyri).id-11]!=0)
												{
													
													jeVPoli=vPoli(RazeniMist.HeapSortDomu.get(ctyri).id, poleObjektu[dva].sousede);
													if(!jeVPoli)
														{
															//System.out.println("Tri");
															poleObjektu[dva].sousede[poleObjektu[dva].pocetSousedu]=RazeniMist.HeapSortDomu.get(ctyri).id;
															poleObjektu[dva].pocetSousedu++;
															//System.out.println(poleObjektu[RazeniDomu.HeapSortDomu.get(ctyri).id].pocetSousedu);
															poleObjektu[RazeniMist.HeapSortDomu.get(ctyri).id].sousede[poleObjektu[RazeniMist.HeapSortDomu.get(ctyri).id].pocetSousedu] = poleObjektu[dva].id;
															poleObjektu[RazeniMist.HeapSortDomu.get(ctyri).id].pocetSousedu++;
															ctyri++;
														}
													else
														{
															if(ctyri!=1099)
																{
																	ctyri++;
																	//System.out.println(poleObjektu[RazeniDomu.HeapSortDomu.get(ctyri).id].pocetSousedu);
																	//System.out.println(poleObjektu[dva].pocetSousedu);
																	//System.out.println("jedna");
																}
															else
																{
																	break;
																}
														}
												}
											else
												{
												//	System.out.println(ctyri);
													ctyri++;
												}
										}
								}
							
						}
				}
			while(poleObjektu[dva].pocetSousedu!=30);
			//System.out.println(dva+" "+Arrays.toString(poleObjektu[dva].sousede));
			//System.out.println(poleObjektu[dva].pocetSousedu);
			dva++;
			tri++;
			ctyri=1;
		}
	while(dva!=1111);
}
/**
 * Metoda Application() zkopiruje Arraylist a aplikuje všechny metody v této třídě.
 */
public static void Application()throws IOException {
       
       spoctiVzdalenosti();

        SpojElec.sloupec = 0;
        // SpojSousedy1.sloupec1=0;
        int jedna = 0;
        int dva = 0;
        do // kopirovani ArrayListu
        {
            poleObjektu[jedna] = Odberatele.poleMistKomplet.get(jedna);
            jedna++;
        } while (jedna != 1111);
        jedna = 0;
        int tri = 11;
        Odberatele.poleMistKomplet.clear();
        do {
            do // kopirovani vzdalenosti do prislusneho pole
            {
                poleObjektu[tri].vzdalenostiDomu[dva] = poleVzdalenostiDomu[dva][jedna];
                // System.out.println(poleObjektu[tri].vzdalenostiDomu[dva]);
                dva++;
            } while (dva != 1100);
            jedna++;
            tri++;
            dva = 0;
        } while (jedna != 1100);

        jedna = 0;
        do {
            Odberatele.poleMistKomplet.add(poleObjektu[jedna]);
            jedna++;

        } while (jedna != 1111);

        Spojuj();
		Odberatele.poleMistKomplet.clear();
		VystupniSoubor();
}
/**
 * Metoda vypisuje do výstupního souboru typ, souradnice, sousedy míst a sousedy elektráren ,který jsou vypočteny ve třídě SpojElec.
 * @throws IOException
 */
	public static void VystupniSoubor ()throws IOException{
	   PrintWriter vystup = new PrintWriter(new BufferedWriter(new FileWriter("vstuptest.txt")));
    	vystup.println("HL");
           Odberatele.poleMistKomplet.add(poleObjektu[0]);
           vystup.println(Odberatele.poleMistKomplet.get(0).x + ";"
                   + Odberatele.poleMistKomplet.get(0).y + ";"
                   + Vypis(poleObjektu[0].Esousede));
           vystup.println("ALT");
       int jedna = 1;
           do {

               Odberatele.poleMistKomplet.add(poleObjektu[jedna]);
               vystup.println(Odberatele.poleMistKomplet.get(jedna).x + ";"
                       + Odberatele.poleMistKomplet.get(jedna).y + ";"
                       + Vypis(poleObjektu[jedna].Gsousede));
               jedna++;
           } while (jedna != 11);
           vystup.println("MISTA");

           jedna = 11;
           do {

               Odberatele.poleMistKomplet.add(poleObjektu[jedna]); // vypis
               vystup.println(Odberatele.poleMistKomplet.get(jedna).typ + ";"
                       + Odberatele.poleMistKomplet.get(jedna).x + ";"
                       + Odberatele.poleMistKomplet.get(jedna).y + ";"
                       + Vypis(poleObjektu[jedna].sousede));
               jedna++;

           } while (jedna != 1111);
           vystup.close();
    }
/**
 * Metoda String která upravý řetezec do příslušného tvaru.
 * @param pole
 * @return
 */
    public static String Vypis(int[] pole) {
        String a = "";
        String b = "";
        int x = 0;
        while (x != pole.length) {
            a = Integer.toString(pole[x]);
            b = b + a + ";";
            a = "";
            x++;

        }
        return b;

    }
    /**
    * Metoda vPoli slouží k porovnávání jestli dum, ktery chceme priradit jako souseda
    * uz sousedem toho domu neni.
    *@param int id, int soused[]
    *@return jeVPoli
    */
    public static boolean vPoli(int id, int soused[])
	{
		int index= 0;
		boolean jeVPoli = false;
		do
			{
				if(soused[index]==id)
					{
						jeVPoli = true;
						break;
					}
				else
					{
						index++;
					}
			}
		while(index!=soused.length);
		
		return jeVPoli;
	}

}
